package com.gjzhao.fammll.service.impl;

import cn.hutool.json.JSONUtil;
import com.gjzhao.fammll.service.OrderService;
import com.gjzhao.fmmall.entity.Orders;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Description: 保存订单 ServiceImpl
 * @Author: gjzhao
 * @Date Created in 2022-02-19 5:03 下午
 */
@Service
public class OrderServiceImpl implements OrderService {

    private Logger logger = LoggerFactory.getLogger(getClass());


    @Autowired
    private AmqpTemplate amqpTemplate;

    /**
     * 保存订单(发送消息到消息队列-使用异步通信的方式)
     *
     * @param order
     */
    @Override
    public void saveOrder(Orders order) {

        logger.info("----开始发送消息到rabbitmq保存订单:{}----", order);

        //使用json字符串方式传递对象
        String orderStr = JSONUtil.toJsonStr(order);
        //如果是简单模式/工作模式，就没有交换机，需要直接发送到队列，此时交换机的位置可设为""
        amqpTemplate.convertAndSend("", "orderQueue", orderStr);

        logger.info("----发送消息到消息队列结束！----");
    }


    /**
     * 保存订单(使用rabbitmq实现订单超时30分钟自动取消)
     *
     * @param order
     */
    @Override
    public void saveOrderByDeadQueue(Orders order) {

        logger.info("----开始处理订单----");

        //todo 订单一系列处理：查询库存等

        //将生成完成的订单发送到消息队列(死信队列：设置了ttl存活时间的队列)中
        String orderStr = JSONUtil.toJsonStr(order);
        amqpTemplate.convertAndSend("orderExchange","k1",orderStr);

        logger.info("----发送消息到消息队列结束！----");

        // todo 订单一系列处理：生成商品快照、删除购物车等

    }
}
